在工作上使用 C/C++ 已經好一段時間,但對於 C/C++ 的編譯一直以來都沒有完全弄懂過,大學時也都是直接使用 Dev C++ 或是 Visual Studio 讓集成開發環境 (IDE) 去處理從源代碼 (Source Code) 到可執行文件 (Executable File) 或是庫文件 (Library) 這段。
對於 Source code 到 Executable File 或 Library 的之間需要經歷哪些步驟,剩下微薄的印象。
貌似在大學時,計算機概論課程有提到過:『源代碼 (Source Code) 經過編譯器 (Compiler),編譯成目標代碼 (Object Code),再經過鏈結器(Linker) 鏈結成可執行文件 (Executable File) 或是庫文件 (Library)』
這類的描述。
嗯,好的,道理我都懂,所以我說那個那隻鴿子為什麼這麼大?
我是說,道理我都懂,但實務上這些步驟是怎麼實現的,腦海中總是沒有一個清晰的樣貌。
- 源代碼 (Source Code) 就是我們寫的那些 C/C++ code,但編譯器 (Compiler) 是誰?
- 目標代碼 (Object Code) 在哪?
- 鏈結器 (Linker) 又是哪位?
- 最後生出的可執行文件 (Executable File), a.k.a 程式,為什麼執行的時候老是跳錯誤訊息:『找不到 xxx 庫 (Library)』。
- 又或是,在 Windows 作業系統上的程式,為什麼放到 Linux 作業系統上不能執行呢?
- 庫文件 (Library) 又分成了 靜態庫 (Static Library) 與動態庫 (Dynamic Link Library),兩者之間的差異是什麼?
- 需要做跨平台編譯 (Cross Compilation) 的話,源代碼到可執行檔之間的步驟會有不一樣嗎?
余憶童稚時 ,大學的系統程式課程中還介紹了組譯器 (Assembler)、連結器 (Linker)、載入器 (Loader)、巨集處理器 (Macro Processor)、編譯器 (Compiler)。
在實務上,他們都是哪些東西呢?
一直以來都是一個不求甚解的態度去面對這些問題,藉由這次的 IT 鐵人賽,打算好好來搞懂這些十萬個為什麼,究竟是什麼。
不過,一個人上路太危險了,帶上這個吧!(X
讓小鼠鼠 (?) 陪你展開這段探究 C/C++ 生老病死的旅程,認識從撰寫到編譯再到可執行程式或庫文件,一路上遇到的各種熟悉的陌生人們。
本系列文章預計範疇為: 先弄懂 C/C++ 編譯流程中的各個專有名詞與其所扮演的角色,會稍微提到一些小時候在大學課堂上聽過的東西,然後以 Linux 為目標平台,先了解 Makefile 的撰寫規則,再進一步使用 CMake 作為建構系統,實現在 Linux 與 Windows 上都能編譯的程式範例。
以實例搭配小時候學的理論,帶你走進 C/C++ 程式的編譯舞台,解析編譯的神秘面紗,揭開程式背後的編譯秘密。